package com.wyl.niupi.webCrawler.controller;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.*;

/**
 * 爬虫demo
 * @author 吴宇亮 on 2020/7/21 0021 下午 3:29
 */
@RequestMapping("/webCrawler/Accessibility")
@RestController
public class AccessibilityTestController {

    private static final Map<String, String> urlMap = new HashMap<>();
    static {
        urlMap.put("吉安容器", "https://www.japc.cn/");
        urlMap.put("无忧英语", "https://wuyou-jiaoyu.com/index.html");
        urlMap.put("银石饰品", "http://www.winstone.cn/");

//        # '有位智能科技': 'http://www.ywpark.net/',
//        # '广荣电子制品': 'http://grelectron.com/',
//        # '中韬华益': 'http://www.tpc12366.com/',
//        # '漱茶官网': 'http://www.ttshucha.com/',
//        # '松山湖大学创新城': 'http://www.dxcxc.cn/',
//        # '达源官网': 'http://www.dgsyhg.com.cn/index.html',
//        # '企美名官网': 'http://qihaoming.1386.link/',
//        # '广州采乐化妆品有限公司': 'http://www.gzcaile.com',
//        # '汕头市德诚食品有限公司': 'http://desunfood.com',
//        # '东莞市迪日自动化机电设备有限公司': 'http://www.dgsam-china.com',
//        # '东莞市全润塑胶有限公司': 'http://www.quanruntpu.com/',
//        # '东莞市展盟展示工程有限公司': 'http://www.zhanmenghuizhan.com/',
//        # '东莞市影翔文化有限公司': 'https://www.ivccdg.com/'
    }

    /** 递归最大深度 **/
    private static final int MAX_DEEP = 4;
    /** 是否打印测试通过的连接 **/
    private static final boolean isOutputRight = false;
    /** 已经测试过的url列表 **/
    private Set<String> checkUrl = new HashSet<>();
    /** 当前递归深度 **/
    private int currentDeep = 1;

    @GetMapping("/accessibilityTest")
    private Object accessibilityTest() throws InterruptedException {
        System.out.println(currentDeep);
        Thread.sleep(1000L);
        for (String key : urlMap.keySet()) {
            String url = urlMap.get(key);
            accessibilityTest("www.japc.cn", key, url);
        }
        System.out.println("程序结束");
        return null;
    }

    /**
     * 测试url下所有子链接是否可达
     *
     * @param domain 域名
     * @param fatherUrl 页面
     * @param url 待测试的url
     */
    private void accessibilityTest(String domain, String fatherUrl, String url){
        // System.out.println("currentDeep: " + currentDeep);
        Objects.requireNonNull(url);
        // 测试当前url是否可访问
        Document dom = null;
        try {
            checkUrl.add(url);
            dom = Jsoup.connect(url).get();
        } catch (IOException e) {
            // 递归出口
            System.err.println("访问失败！父页面为【" + fatherUrl + "】， 访问失败连接为：【" + url + "】");
            currentDeep -= 1;
            return;
        }
        if(isOutputRight){
            System.out.println("访问成功！父页面为【" + fatherUrl + "】， 访问成功连接为：【" + url + "】");
        }

        if ((currentDeep >= MAX_DEEP)) {
            // 递归出口
            currentDeep -= 1;
            return;
        }
        // 获取当前网站的所有的子链接
        Set<String> childUrlList = getChildUrl(domain, dom);
        if(CollectionUtils.isEmpty(childUrlList)){
            // 递归出口
            currentDeep -= 1;
            return;
        }

        for (String childUrl : childUrlList) {
            if(checkUrl.contains(childUrl)){https://www.japc.cn/ProductClass-3-1.html
                continue;
            }else{
                // 递归递进
                currentDeep += 1;
                accessibilityTest(domain, url, childUrl);
            }
        }

        // 递归出口
        currentDeep -= 1;
        return;
    }

    /**
     * 获取当前网站的所有的子链接
     */
    private Set<String> getChildUrl(String domain, Document dom){
        Set<String> result = new HashSet<>();
        Elements elements = dom.getElementsByTag("a");
        for (Element element : elements) {
            String href = element.attr("abs:href");
            if(href.indexOf(domain) != -1){
                result.add(href);
            }
        }
        return result;
    }


}
